﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ProfilingTestProject"
    targetNamespace="http://www.minehe.net/ProfilingTestProject.xsd"
    elementFormDefault="qualified"
    xmlns="http://www.minehe.net/ProfilingTestProject.xsd"
    xmlns:mstns="http://www.minehe.net/ProfilingTestProject.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <!--测试项目-->
  <xs:element name="ProfilingTestProject">
    <xs:complexType>
      <xs:sequence>
        <!--唯一ID-->
        <xs:element name="Id" type="xs:string"/>
        <!--标题-->
        <xs:element name="Title" type="xs:string"/>
        <!--描述-->
        <xs:element name="Description" type="xs:string"/>
        <!--测试用例集合-->
        <xs:element name="Cases">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Case" type="ProfilingTestCase" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!--测试用例-->
  <xs:complexType name="ProfilingTestCase">
    <xs:sequence>
      <!--唯一ID-->
      <xs:element name="Id" type="xs:string"/>
      <!--标题-->
      <xs:element name="Title" type="xs:string"/>
      <!--描述-->
      <xs:element name="Description" type="xs:string"/>
      <!--测试循环次数-->
      <xs:element name="LoopTimes" type="xs:long"/>
      <!--是否无限循环-->
      <xs:element name="LoopForever" type="xs:boolean"/>
      <!--两次测试用例循环之间的延时设置-->
      <xs:element name="Intervals" type="IntervalSettings"/>
      <!--初始化类的类名称，必须实现IProfilingTestCaseInitializer接口-->
      <xs:element name="InitializerClass" type="xs:string"/>
      <!--资源释放类的类名称，必须实现IProfilingTestCaseDisposer接口-->
      <xs:element name="DisposerClass" type="xs:string"/>
      <!--分布式远程分析测试设置-->
      <xs:element name="DistributedSetting" type="DistributedProfilingSettings" nillable="true"/>
      <!--本活动的待测试活动集合-->
      <xs:element name="Activities">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ActivityClass" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!--分布式远程分析测试设置-->
  <xs:complexType name="DistributedProfilingSettings">
    <xs:sequence>
      <!--分析测试的通讯模式，如果是Wcf或LocalWcf则会首先阻塞Activities的执行直到有Wcf请求进入-->
      <xs:element name="CommunicationMode" type="ProfilingCommunicationMode"/>
      <!--如果CommunicationMode是Wcf或LocalWcf，则此属性指定当前测试用例在QuarkDistributedProfilingService服务中的命名，必须唯一-->
      <xs:element name="WcfNaming" type="xs:string"/>
      <!--客户端的Wcf请求类-->
      <xs:element name="ClientRequestClass" type="xs:string"/>
      <!--客户端请求模式-->
      <xs:element name="ClientRequestMode" type="ProfilingClientRequestMode"/>
      <!--如果ClientRequestMode=Timing，每次请求的时间间隔，毫秒单位-->
      <xs:element name="ClientTimingRequestInterval" type="xs:int"/>
      <!--如果ClientRequestMode=Timing，每次请求的随机间隔的因数，本随机时间与ClientTimingRequestInterval是叠加的-->
      <!--随机执行0-ClientTimingRequestRandomInterval之间的一个时间间隔-->
      <xs:element name="ClientTimingRequestRandomInterval" type="xs:int"/>
      <!--如果ClientRequestMode=Looping，请求的总次数，如果为0表示无限循环测试-->
      <xs:element name="ClientLoopingTimes" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>

  <!--分析测试的通讯模式-->
  <xs:simpleType name="ProfilingCommunicationMode">
    <xs:restriction base="xs:string">
      <!--进程内-->
      <xs:enumeration value="InProcess"/>
      <!--本地进程通讯-->
      <xs:enumeration value="LocalWcf"/>
      <!--分布式通讯-->
      <xs:enumeration value="Wcf"/>
    </xs:restriction>
  </xs:simpleType>

  <!--客户端请求频率模式-->
  <xs:simpleType name="ProfilingClientRequestMode">
    <xs:restriction base="xs:string">
      <!--定时器-->
      <xs:enumeration value="Timing"/>
      <!--循环-->
      <xs:enumeration value="Looping"/>
    </xs:restriction>
  </xs:simpleType>

  <!--延时设置-->
  <xs:complexType name="IntervalSettings">
    <xs:sequence>
      <!--延时模式-->
      <xs:element name="Mode" type="IntervalMode"/>
      <!--固定的延时值，毫秒单位-->
      <xs:element name="FixedInterval" type="xs:int"/>
      <!--最小延时值，毫秒单位，必须大于等于0-->
      <xs:element name="MinInterval" type="xs:int"/>
      <!--最大延时值，毫秒单位，必须大于等于MinInterval-->
      <xs:element name="MaxInterval" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="IntervalMode">
    <xs:restriction base="xs:string">
      <!--不做延时-->
      <xs:enumeration value="None"/>
      <!--固定延时值-->
      <xs:enumeration value="Fixed"/>
      <!--随机延时值-->
      <xs:enumeration value="Random"/>
    </xs:restriction>
  </xs:simpleType>

  <!--测试状态-->
  <xs:simpleType name="TestState">
    <xs:restriction base="xs:string">
      <!--未开始运行-->
      <xs:enumeration value="Ready"/>
      <!--正在运行-->
      <xs:enumeration value="Started"/>
      <!--运行完毕-->
      <xs:enumeration value="Finished"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TestFinishReason">
    <xs:restriction base="xs:string">
      <!--未开始运行或运行未完毕-->
      <xs:enumeration value="N_A"/>
      <!--正常结束-->
      <xs:enumeration value="LoopEnd"/>
      <!--在测试循环时设置事件参数退出测试循环-->
      <xs:enumeration value="LoopBroken"/>
      <!--被强制停止-->
      <xs:enumeration value="Stopped"/>
      <!--发生异常导致中止-->
      <xs:enumeration value="Exceptioned"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
